package com.ctshk.rpc.system.service;

import java.util.List;

import com.ctshk.common.dto.Result;
import com.ctshk.rpc.system.dto.QueryChildrenDeptDTO;
import com.ctshk.rpc.system.dto.SysDepartmentDTO;
import com.ctshk.rpc.system.dto.SysDepartmentEmployeeDTO;
import com.ctshk.rpc.system.req.SysDepartmentReq;

/**
 * <p>
 * 组织架构 服务类
 * </p>
 *
 * @author 谢诗宏
 * @since 2020-12-22
 */
public interface ISysDepartmentService {

    /**
     * 新增组织架构
     * @param sysDepartmentReq
     * @param userId
     * @return
     */
    int add(SysDepartmentReq sysDepartmentReq, long userId);

    /**
     * 删除组织架构
     * @param deptId
     * @param userId
     * @return
     */
    int del(long deptId, long userId);

    /**
     * 编辑组织架构
     * @param sysDepartmentReq
     * @param userId
     * @return
     */
    int update(SysDepartmentReq sysDepartmentReq, long userId);

    /**
     * 查询组织架构
     * @param deptId
     * @param userId
     * @return
     */
    List<SysDepartmentDTO> query(long deptId, long userId,boolean isAll);

    /**
     * 设置组织架构是否有效
     * 根据deptId获取所有父级和子级id
     * 如果:status==1,将当前deptId包括自己的所有父级和子级数据status状态置为1有效-(无需当前deptId的同级)
     * 如果:status==0,将当前deptId包括自己的所有子级数据status状态置为0无效-(无需当前deptId的同级)
     * @param deptId
     * @param userId
     */
    void setStatus(long deptId, int status, long userId);

    /**
     * 查询完整组织架构+部门员工
     * @param searchName
     *  查询searchName可能是部门名称或者是员工姓名
     * @return
     */
    List<SysDepartmentEmployeeDTO> queryDeptEmployees(String searchName, String type);

    /**
     * 查询单条部门信息
     * @param deptId
     * @return
     */
    SysDepartmentDTO queryOne(long deptId);

    /**
     * 根据userId查询单条部门信息
     * @param userId
     * @return
     */
    SysDepartmentDTO queryByUserId(long userId);

    /**
     * 根据userId查询所有上级部门信息
     * @param userId
     * @return
     */
    List<Long> queryIdsByUserId(long userId);

    /**
     * 根据deptId查询所有上级部门信息
     * @param deptId
     * @return
     */
    List<Long> queryIdsById(long deptId);

    /**
     * 根据deptId和userId判断用户是否在指定部门下
     * @param deptId
     * @param userId
     * @return
     */
    boolean isExist(long deptId, long userId);

    /**
     * 根据deptIds和userId判断用户是否在指定部门下
     * @param deptIds
     * @param userId
     * @return
     */
    boolean isExists(List<Long> deptIds, long userId);

    /**
     * 根据deptId获取当前部门的所有人员id(包括失效和已删除的账号)
     * @param deptId
     * @return
     */
    List<Long> queryCUserIdsByDeptId(long deptId);

    /**
     * 根据deptId获取当前部门的所有人员id(有效的)
     * @param deptId
     * @return
     */
    List<Long> queryCUserIdsByDeptIdEffective(long deptId);

    /**
     * 根据deptId获取当前部门(包括下级部门)的所有人员id(包括失效和已删除的账号)
     * @param deptId
     * @return
     */
    List<Long> queryUserIdsByDeptId(long deptId);

	/**查询下级部门
	 * @return
	 */
	Result<List<QueryChildrenDeptDTO>> queryChildrenDept();
}
